// Symbol 类型
// # 特点
/**
    Symbol 的值是唯一的，用来解决命名冲突
    Symbol 值不能与其他数据类型进行运算
    Symbol 定义的对象属性不能使用for...in 循环遍历
 */
// 用法
// 创建一个symbol，只能使用  symbol() 函数创建，而不能使用 new symbol(),创建
var sys = Symbol('sys');
// 同时由于symbol创建的是一个值，而非一个对象，所以不能再其中添加任何属性
// 再创建一个symbol时候内部接受一个字符串作为参数，用来描述当前值。因此即使定义 symbol 使用相同的参数互相之间也不是相同的
var s1 = Symbol('s');
var s2 = Symbol('s');
s1 === s2; // false
// Symbol.for() 会在全局中创建一个，symbol值。在创建时候会检查全局 symbol的值是否再全局中注册过，如果没有这注册，否则返回旧的
// 且 Symbol('s') 和 Symbol.for('s') 不相等
var s3 = Symbol('s1'); // 声明在局部
var s4 = Symbol.for('s1'); // 声明在全局
s3 === s4; //false
var s5 = Symbol.for('s1');
s4 === s5; //true
// Symbol.keyFor() 方法表示获取一个 symbol 的值在全局中注册的命名参数 key，只有使用 Symbol.for() 创建的值才会有注册的命名参数，使用 Symbol() 生成的值则没有
var s4 = Symbol('sym');
var s5 = Symbol.for('sym');
Symbol.keyFor(s4); // undefined
Symbol.keyFor(s5); // sym
/**
 * 基本数据类型
 *
 * USONB
 * U undefined
 * S String
 * O Object
 * N Number
 * N null
 * B Boolean
 */ 
